package com.yjd.bi.etl.user.service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

import com.yjd.bi.etl.comm.BaseService;
import com.yjd.bi.etl.comm.Constants;
import com.yjd.bi.etl.sql.UserSqlConstants;
import com.yjd.bi.report.model.BiDatabaseInfoModel;
import com.yjd.bi.report.util.BiUtil;
import com.yjd.comm.util.DateUtil;
import com.yjd.comm.util.FrameUtil;

@Component("retentionRateService")
public class RetentionRateService extends BaseService {

	private static final int DAYOFSECOND = 86400;

	/**
	 * 登录留存率
	 * 
	 * @throws Exception
	 */
	public void loginRetentionRateCount() throws Exception {
		BiDatabaseInfoModel model = this.getBiDatabaseInfoModel();
		JdbcTemplate jt = BiUtil.getJdbcTemplate(model);

		// 统计历史数据
		long maxDate = jt.queryForInt(UserSqlConstants.GET_MAX_LOGIN_DATE);

		if (maxDate == 0) {
			// 没有统计过，取网站上线运营的第一天 平台上线时间（2013年12月21日00：00：00）
			maxDate = Constants.INITIALIZATION_TIME;
		} else {
			maxDate = DateUtil.dateStringToTimestamp(maxDate + "",
					DateUtil.PATTERN_yyyyMMdd);
		}

		while (maxDate < FrameUtil.getTime()) {
			// 统计前一天的用户登录数据
			maxDate += DAYOFSECOND;// 加一天和当前时间比较，如果小于当前时间则继续统计
			retentionRateDayStatistic(model, maxDate, jt);
			

		}
	}

	/**
	 * 每日登录留存率处理
	 * 
	 * @throws Exception
	 */
	public void retentionRateDayStatistic(BiDatabaseInfoModel model,
			long maxDate, JdbcTemplate jt) throws Exception {
		List<Object> insertObjects = new ArrayList<Object>();

		//查询某日登录的用户id（去重）
		List<Map<String, Object>> user_ids = jt.queryForList(
				UserSqlConstants.QUERY_LOGIN_USER_ID_SQL, maxDate, maxDate
						+ DAYOFSECOND - 1);
		for (Map<String, Object> map : user_ids) {
			int user_id = (int) map.get("user_id");
			logger.info(user_id);
			//获取用户的注册时间
			long reg_date = jt.queryForLong(UserSqlConstants.QUERY_REG_DATE_SQL, user_id);
			
			if(reg_date!=0L){
				Object insertObject = new Object[] {
						Long.parseLong(DateUtil.timestampToDateString(reg_date,
								DateUtil.PATTERN_yyyyMMdd)),
						Long.parseLong(DateUtil.timestampToDateString(maxDate,
								DateUtil.PATTERN_yyyyMMdd)), user_id };
				insertObjects.add(insertObject);
			}
		}
		if (insertObjects != null) {
			batchUpdateData(model, UserSqlConstants.INSERT_RETENTION_RATE,
					insertObjects);
		}

	}
	
	
	
	
	/**
	 * 投资留存率
	 * 
	 * @throws Exception
	 */
	public void investRetentionRateCount() throws Exception {
		BiDatabaseInfoModel model = this.getBiDatabaseInfoModel();
		JdbcTemplate jt = BiUtil.getJdbcTemplate(model);

		// 统计历史数据
		long maxDate = jt.queryForInt(UserSqlConstants.GET_MAX_INVEST_DATE);

		if (maxDate == 0) {
			// 没有统计过，取网站上线运营的第一天 平台上线时间（2013年12月21日00：00：00）
			maxDate = Constants.INITIALIZATION_TIME;
		} else {
			maxDate = DateUtil.dateStringToTimestamp(maxDate + "",
					DateUtil.PATTERN_yyyyMMdd);
		}

		while (maxDate < FrameUtil.getTime()) {
			// 统计前一天的用户登录数据
			maxDate += DAYOFSECOND;// 加一天和当前时间比较，如果小于当前时间则继续统计
			retentionRateDayInvestStatistic(model, maxDate, jt);
			

		}

	}
	
	/**
	 * 投资留存率每日统计
	 * @param model
	 * @param maxDate
	 * @param jt
	 * @throws Exception
	 */
	public void retentionRateDayInvestStatistic(BiDatabaseInfoModel model,
			long maxDate, JdbcTemplate jt)throws Exception {
		List<Object> insertObjects = new ArrayList<Object>();

		List<Map<String, Object>> user_ids = jt.queryForList(
				UserSqlConstants.QUERY_INVEST_USER_ID_SQL, maxDate, maxDate
						+ DAYOFSECOND - 1);
		logger.info("maxDate:"+maxDate +",user_ids:"+user_ids);
		for (Map<String, Object> map : user_ids) {
			int user_id = (int) map.get("user_id");
			Object insertObject = new Object[] {Long.parseLong(DateUtil.timestampToDateString(maxDate,DateUtil.PATTERN_yyyyMMdd)), user_id };
			insertObjects.add(insertObject);
		}
		if (insertObjects != null) {
			batchUpdateData(model, UserSqlConstants.INSERT_INVEST_RETENTION_RATE,insertObjects);
		}
		
	}
	
}
